From 41ec7cd7bed85e4ef81de30f39238c0e56185f4d Mon Sep 17 00:00:00 2001 From: Tim Deegan Date: Fri, 2 Mar 2007 13:46:39 +0000 Subject: [PATCH] [XEN] Remove a race condition in shadow mark_dirty code. Signed-off-by: Tim Deegan --- xen/arch/x86/mm/shadow/common.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 0c66bc18cf..5b96bd986a 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -2912,7 +2912,16 @@ void sh_mark_dirty(struct domain *d, mfn_t gmfn) * can be called from __hvm_copy during emulation). * If the lock isn't held, take it for the duration of the call. */ do_locking = !shadow_locked_by_me(d); - if ( do_locking ) shadow_lock(d); + if ( do_locking ) + { + shadow_lock(d); + /* Check the mode again with the lock held */ + if ( unlikely(!shadow_mode_log_dirty(d)) ) + { + shadow_unlock(d); + return; + } + } ASSERT(d->arch.paging.shadow.dirty_bitmap != NULL); -- 2.30.2